# weather_tmp.py
import requests
from bs4 import BeautifulSoup
import csv
import json
import pymysql
import pandas as pd
from sqlalchemy import create_engine
import datetime
import pandas as pd
from pyecharts import options as opts
from pyecharts.charts import Line


def getHTMLtext(url):
    """请求获得网页内容"""
    try:
        r = requests.get(url, timeout=30)
        r.raise_for_status()
        r.encoding = r.apparent_encoding
        print("成功访问")
        return r.text
    except:
        print("访问错误")
        return " "


def weather_day7(html):
    """处理得到有用信息保存数据文件"""
    weather_day7_data = pd.DataFrame(columns=['日期', '天气', '最低气温', '最高气温', '风向1', '风向2', '风级'],
                                     data=None)
    bs = BeautifulSoup(html, "html.parser")  # 创建BeautifulSoup对象
    body = bs.body
    data = body.find('div', {'id': '7d'})  # 找到div标签且id = 7d
    # 下面爬取7天的数据
    ul = data.find('ul')  # 找到所有的ul标签
    li = ul.find_all('li')  # 找到左右的li标签
    i = 0  # 控制爬取的天数
    for day in li:  # 遍历找到的每一个li
        if 0 < i < 7:
            temp = []  # 临时存放每天的数据
            date = day.find('h1').string  # 得到日期
            date = date[0:date.index('日')]  # 取出日期号
            time = datetime.datetime.now()
            month = time.strftime('%Y-%m')
            temp.append(f"{month}-{date} 00:00:00")
            inf = day.find_all('p')  # 找出li下面的p标签,提取第一个p标签的值，即天气
            temp.append(inf[0].string)

            tem_low = inf[1].find('i').string  # 找到最低气温

            if inf[1].find('span') is None:  # 天气预报可能没有最高气温
                tem_high = None
            else:
                tem_high = inf[1].find('span').string  # 找到最高气温
            temp.append(int(tem_low[:-1]))
            if tem_high[-1] == '℃':
                temp.append(int(tem_high[:-1]))
            else:
                temp.append(int(tem_high))

            wind = inf[2].find_all('span')  # 找到风向
            for j in wind:
                temp.append(j['title'])

            wind_scale = inf[2].find('i').string  # 找到风级
            index1 = wind_scale.index('级')
            temp.append(int(wind_scale[index1 - 1:index1]))
            weather_day7_data.loc[len(weather_day7_data)] = temp
        i = i + 1
    return weather_day7_data


def weather_day15(html):
    """处理得到有用信息保存数据文件"""
    weather_day15_data = pd.DataFrame(columns=['日期', '天气', '最低气温', '最高气温', '风向1', '风向2', '风级'],
                                      data=None)
    bs = BeautifulSoup(html, "html.parser")  # 创建BeautifulSoup对象
    body = bs.body
    data = body.find('div', {'id': '15d'})  # 找到div标签且id = 15d
    ul = data.find('ul')  # 找到所有的ul标签
    li = ul.find_all('li')  # 找到左右的li标签
    i = 0  # 控制爬取的天数
    for day in li:  # 遍历找到的每一个li
        if i < 8:
            temp = []  # 临时存放每天的数据
            date = day.find('span', {'class': 'time'}).string  # 得到日期
            date = date[date.index('（') + 1:-2]  # 取出日期号
            time = datetime.datetime.now()
            month = time.strftime('%Y-%m')
            temp.append(f"{month}-{date} 00:00:00")
            weather = day.find('span', {'class': 'wea'}).string  # 找到天气
            temp.append(weather)
            tem = day.find('span', {'class': 'tem'}).text  # 找到温度
            temp.append(int(tem[tem.index('/') + 1:-1]))  # 找到最低气温
            temp.append(int(tem[:tem.index('/') - 1]))  # 找到最高气温
            wind = day.find('span', {'class': 'wind'}).string  # 找到风向
            if '转' in wind:  # 如果有风向变化
                temp.append(wind[:wind.index('转')])
                temp.append(wind[wind.index('转') + 1:])
            else:  # 如果没有风向变化，前后风向一致
                temp.append(wind)
                temp.append(wind)
            wind_scale = day.find('span', {'class': 'wind1'}).string  # 找到风级
            index1 = wind_scale.index('级')
            temp.append(int(wind_scale[index1 - 1:index1]))

            weather_day15_data.loc[len(weather_day15_data)] = temp
    return weather_day15_data


def write_to_csv(file_name, data, day=14):
    """保存为csv文件"""
    with open(file_name, 'w', errors='ignore', newline='') as f:
        if day == 14:
            header = ['日期', '天气', '最低气温', '最高气温', '风向1', '风向2', '风级']
        else:
            header = ['小时', '温度', '风力方向', '风级', '降水量', '相对湿度', '空气质量']
        f_csv = csv.writer(f)
        f_csv.writerow(header)
        f_csv.writerows(data)


def weather_hour(url="https://www.weather.com.cn/weather1d/101221501.shtml"):
    r = requests.get(url, timeout=30)
    r.raise_for_status()
    r.encoding = r.apparent_encoding
    day1_html = r.text
    # data = pd.DataFrame(columns=['城市', '时间', '温度', '风力方向', '风级', '降水量', '相对湿度', '空气质量'],
    #                     data=None)
    data = pd.DataFrame(columns=['city', 'date', 'temp', 'direction', 'scale', 'precipitation', 'humidity', 'quality'],
                        data=None)
    bs = BeautifulSoup(day1_html, "html.parser")  # 创建BeautifulSoup对象
    body = bs.body
    data2 = body.find_all('div', {'class': 'left-div'})
    text = data2[1].find('script').string
    text = text[text.index('=') + 1:-2]  # 移除改var data=将其变为json数据
    jd = json.loads(text)
    dayone = jd['od']['od2']  # 找到当天的数据
    dayone = dayone[1:]
    hour = dayone[0]['od21']
    for i in dayone:
        if (i['od21'] <= hour):
            time = datetime.datetime.now() + datetime.timedelta(days=1)
            day = time.strftime('%Y-%m-%d')
        else:
            time = datetime.datetime.now()
            day = time.strftime('%Y-%m-%d')
        temp = []
        temp.append("安庆")  # 添加时间
        temp.append(f"{day} {i['od21']}:00:00")  # 添加时间
        temp.append(float(i['od22']))  # 添加当前时刻温度
        temp.append(i['od24'])  # 添加当前时刻风力方向
        temp.append(int(i['od25']))  # 添加当前时刻风级
        temp.append(int(i['od26']))  # 添加当前时刻降水量
        temp.append(int(i['od27']))  # 添加当前时刻相对湿度
        temp.append(int(i['od28']))  # 添加当前时刻控制质量
        data.loc[len(data)] = temp

    data.sort_values(by="date", ascending=True, inplace=True)

    return data


def weather_day15_data_to_mysql(param, data14, param1):
    pass


def data_to_mysql(data, table_name):
    pymysql.install_as_MySQLdb()
    engine = create_engine("mysql+pymysql://root:Qx181220...@localhost:3306/weather")
    data.to_sql(table_name, con=engine, chunksize=10000, if_exists='replace')


def compute_rule(weather_hour_data):
    weather_hour_data["异常标记"] = weather_hour_data["温度"].apply(lambda x: '温度异常' if x > 6 else '')
    return weather_hour_data


def main():
    """主函数"""
    # print("Weather test")
    # # 珠海
    # day1_url = 'https://www.weather.com.cn/weather1d/101221501.shtml'  # 7天天气中国天气网
    #
    # day1_html = getHTMLtext(day1_url)
    #
    # weather_hour_data = weather_hour(day1_html)
    #
    # weather_hour_data = compute_rule(weather_hour_data)
    # print(weather_hour_data)
    #
    # # data_to_mysql(weather_hour_data, "weather_hour")
    # #
    # url1 = 'http://www.weather.com.cn/weather/101221501.shtml'  # 7天天气中国天气网
    # html1 = getHTMLtext(url1)
    # weather_day7_data = weather_day7(html1)  # 获得1-7天和当天的数据
    # #
    # url2 = 'http://www.weather.com.cn/weather15d/101221501.shtml'  # 8-15天天气中国天气网
    # html2 = getHTMLtext(url2)
    # weather_day15_data = weather_day15(html2)  # 获得8-14天数据
    #
    # weather_days_data = pd.concat([weather_day7_data, weather_day15_data], axis=0)
    #
    # print(weather_days_data)
    #
    # data_to_mysql(weather_days_data, "weather_days")

    hour_data = weather_hour()
    # print(hour_data.to_dict(orient="records"))
    print(hour_data[["date","temp"]].to_dict(orient="split"))


if __name__ == '__main__':
    main()
